package com.cy.stores.service.impl;

import com.cy.stores.mapper.UserMapper;
import com.cy.stores.pojo.User;
import com.cy.stores.service.IUserService;
import com.cy.stores.service.ex.InsertException;
import com.cy.stores.service.ex.PasswordNotMatchException;
import com.cy.stores.service.ex.UserNotFoundException;
import com.cy.stores.service.ex.UsernameDuplicateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.Date;
import java.util.UUID;

//用户模块业务层实现类
@Service
public class UserServiceImpl implements IUserService {
    //@Service注解将当前类的对象交给Spring来管理，自动创建对象，以及维护
    @Autowired
    private UserMapper userMapper;
    @Override
    public void reg(User user) {
        //user获取传递过来的username
        String username = user.getUsername();
        //调用findByUsername判断用户是否被注册过
        User result = userMapper.findByUsername(username);
        //判断是否为不为空，则抛出被占用的异常
        if (result != null) {
            throw new UsernameDuplicateException("尝试注册的用户名["+username+"]已经被占用");
        }
        //密码加密处理实现——MD5算法加密，连续加载三次
        //盐值——随机字符串
        String password = user.getPassword();
//        获取盐值并随机字符串盐值,为了后面实现用户的登录做准备
        String salt = UUID.randomUUID().toString().toUpperCase();
        //不数据，盐值的记录
        user.setSalt(salt);
//        将密码和盐值作为整体做加密处理
        String md5Password = getMD5Password(password, salt);
        //将加密后的密码重新补全到user对象中
        user.setPassword(md5Password);
        //补全数据：is_delete设置成0
        user.setIsDelete(0);
        //补全数据的四个日志字段信息
        user.setCreatedUser(user.getUsername());
        user.setModifiedUser(user.getUsername());
        Date date = new Date();
        user.setCreatedTime(date);
        user.setModifiedTime(date);
        //执行注册业务功能的实现（rows==1）
        Integer insert = userMapper.insert(user);
        if (insert != 1) { 
            throw new InsertException("在用户注册过程中产生了未知的异常");
        }


    }
    @Override
    public User login(String username, String password) {
        User result = userMapper.findByUsername(username);
//        判断查询结果是否为null
        if (result == null) {
            // 是：抛出UserNotFoundException异常
            throw new UserNotFoundException("用户数据不存在");
        }
//        判断查询结果中的isDelete是否为1
        if (result.getIsDelete() == 1){
            // 是：抛出UserNotFoundException异常
            throw new UserNotFoundException("用户数据不存在");
        }
//        从查询结果中获取盐值
        String salt = result.getSalt();
        // 调用getMd5Password()方法，将参数password和salt结合起来进行加密
        String md5Password = getMD5Password(password, salt);
        // 判断查询结果中的密码，与以上加密得到的密码是否不一致
        if (!result.getPassword().equals(md5Password)) {
            throw new PasswordNotMatchException("密码验证错误");
        }


        // 创建新的User对象
        User user = new User();
        // 将查询结果中的uid、username、avatar封装到新的user对象中
        user.setUid(result.getUid());
        user.setUsername(username);
        user.setAvatar(result.getAvatar());
        //返回新的user对象，可以减轻层与层之间调用传输数据的压力
        return user;
    }
    //声明MD5加密处理
    public String getMD5Password(String password, String salt) {
        for (int i = 0; i < 3; i++) {  //MD5加密算法调用，三次加密
            password = DigestUtils.md5DigestAsHex((salt + password + salt).getBytes()).toUpperCase();
        }
        return password;
    }
}
